package com.hzit.manager.service.impl;

import java.util.List;

import com.alibaba.fastjson.JSON;
import com.hzit.manager.api.domain.Brand;

import com.hzit.user.RemoteUserService;
import com.ruoyi.common.core.exception.MyException;
import com.ruoyi.common.core.web.domain.AjaxResult;
import io.seata.core.context.RootContext;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import com.hzit.manager.mapper.BrandMapper;

import com.hzit.manager.service.IBrandService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 品牌Service业务层处理
 * 
 * @author wf
 * @date 2023-08-29
 */
@Service
@Slf4j
public class BrandServiceImpl implements IBrandService 
{
    @Autowired
    private BrandMapper brandMapper;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    RemoteUserService userService;

    /**
     * 查询品牌
     * 
     * @param id 品牌主键
     * @return 品牌
     */
    @Override
    public Brand selectBrandById(Long id)
    {
        String s = redisTemplate.opsForValue().get(id + "");

        return brandMapper.selectBrandById(id);
    }

    /**
     * 查询品牌列表
     * 
     * @param brand 品牌
     * @return 品牌
     */
    @Override
    public List<Brand> selectBrandList(Brand brand)
    {
        return brandMapper.selectBrandList(brand);
    }

    /**
     * 新增品牌
     * 
     * @param brand 品牌
     * @return 结果
     */
    @Override
    public int insertBrand(Brand brand)
    {
        int i = brandMapper.insertBrand(brand);
        // 存放到redis中
        redisTemplate.opsForValue().set(brand.getId() + "", JSON.toJSONString(brand));
        return i;
    }

    /**
     * 修改品牌
     * 
     * @param brand 品牌
     * @return 结果
     */
    @Override
    public int updateBrand(Brand brand)
    {
        return brandMapper.updateBrand(brand);
    }

    /**
     * 批量删除品牌
     * 
     * @param ids 需要删除的品牌主键
     * @return 结果
     */
    @Override
    public int deleteBrandByIds(Long[] ids)
    {
        return brandMapper.deleteBrandByIds(ids);
    }

    /**
     * 删除品牌信息
     * 
     * @param id 品牌主键
     * @return 结果
     */
    @Override
    public int deleteBrandById(Long id)
    {
        return brandMapper.deleteBrandById(id);
    }

    /**
     * 分布式事务演示,保存品牌的同时保存用户
     */
	@Override
    @GlobalTransactional        // 开启一个全局的分布式事务
    @Transactional(rollbackFor=Exception.class)
	public void saveBrandAndUser() {
        String xid = RootContext.getXID();
        log.info("xid: {}",xid);
        //1. 构造要添加的品牌
        Brand brand = new Brand();
        brand.setFirstChar("Q");
        brand.setName("七匹狼");
        //2. 保存品牌
        brandMapper.insertBrand(brand);

        //3. 保存用户
        AjaxResult result = userService.saveUser();  // 熔断器返回的值
        if (result.get("code").toString().equals("500")) {
            throw new MyException("保存用户失败！");
        }
	}
}
